import { getAdministrativeDivisionCity, getAdministrativeDivisionCounty, getAdministrativeDivisionCountyLabel } from '@/api/home'

import { useDigitalTwinStore } from '@/stores/digitalTwin'
const digitalTwinStore = useDigitalTwinStore()

const cameraParam = [554876.14875, 3386383.881719, 104995.88, -54.943035, -89.999977, 2]
const hideLayer = ['手工模型', 'cim2建筑', '苏州地形影像_Water']
const height = 10000
const LayerIdObj: any = {
  polyline: [],
  polygon3d: []
}

export const initAdministrativeDivision = async () => {
  console.log('initAdministrativeDivision')
  // 1 调整相机视角
  await fdapi.camera.set(cameraParam)
  // 2 样式调整：a.打开黑暗模式  b.隐藏手工模型  c.调整地形影像的亮度
  await setStyles()
  // 3 绘制市边界 a.顶面  b.顶面边框  c.立体围墙
  await addCityLayer()
  // 4 绘制区县边界（行政区化）  a.行政区边框
  await addCountyLayer()
  // 5 行政区名称
  await addCountyLabelLayer()
}

// 样式调整
const setStyles = async () => {
  //样式调整：a.打开黑暗模式  b.隐藏手工模型  c.调整地形影像的亮度
  await fdapi.weather.setDarkMode(true)
  await fdapi.infoTree.hide(hideLayer.map(name => digitalTwinStore.infoTreeObj[name]))
  await fdapi.tileLayer.setStyle(digitalTwinStore.infoTreeObj['大地形影像'], null, null, null, 0.1)
  await fdapi.tileLayer.setStyle(digitalTwinStore.infoTreeObj['苏州地形影像_Terrain'], null, null, null, 0.5)
}

// 绘制市边界
const addCityLayer = async () => {
  const { data } = await getAdministrativeDivisionCity()
  // a.顶面  b.顶面边框  c.立体围墙
  const coordinates = data.features[0].geometry.coordinates[0][0]

  const city_polygon = {
    id: 'city_polygon',
    coordinates: coordinates.map((coord: number[]) => [coord[0], coord[1], height - 1]),
    coordinateType: 0, //坐标系类型，取值范围：0为Projection类型，1为WGS84类型，2为火星坐标系(GCJ02)，3为百度坐标系(BD09)，默认值：0
    range: [1, 10000000], //可视范围：[近裁距离, 远裁距离]，取值范围: [任意负值, 任意正值]
    color: [5 / 255, 50 / 255, 74 / 255, 0.6], //多边形的填充颜色
    intensity: 1, //亮度
    style: 0, //单色 请参照API开发文档选取枚举
    depthTest: false, //是否做深度检测 开启后会被地形高度遮挡
    priority: 1 //显示优先级 值越大显示越靠上
  }
  const city_polygon_dynamic = {
    id: 'city_polygon_dynamic',
    coordinates: coordinates.map((coord: number[]) => [coord[0], coord[1], height]),
    coordinateType: 0, //坐标系类型，取值范围：0为Projection类型，1为WGS84类型，2为火星坐标系(GCJ02)，3为百度坐标系(BD09)，默认值：0
    range: [1, 10000000], //可视范围：[近裁距离, 远裁距离]，取值范围: [任意负值, 任意正值]
    intensity: 1, //亮度
    depthTest: false, //是否做深度检测 开启后会被地形高度遮挡
    priority: 1, //显示优先级 值越大显示越靠上
    material: '/JC_CustomAssets/PolygonLibrary/Exhibition/平面混合_2', //自定义材质路径 设置后style相关参数会失效
    scalarParameters: [
      { name: '亮条U速度', value: 0.1 },
      { name: '亮条V速度', value: 0.1 },
      { name: '亮条UV', value: 0.25 },
      { name: '亮条亮度', value: 10 },
      { name: '亮条旋转', value: 0.33 },
      { name: '亮度', value: 2 },
      { name: 'UV缩放', value: 0.001 },
      { name: '不透明度', value: 0.01 }
    ], //材质数值类型参数
    vectorParameters: [{ name: '颜色', value: [19 / 255, 204 / 255, 255 / 255] }] //材质数组类型参数
  }
  fdapi.polygon.add([city_polygon, city_polygon_dynamic])

  const city_border = {
    id: 'city_border', //折线唯一标识id
    coordinates: coordinates.map((coord: number[]) => [coord[0], coord[1], height]),
    coordinateType: 0, //坐标系类型，取值范围：0为Projection类型，1为WGS84类型，2为火星坐标系(GCJ02)，3为百度坐标系(BD09)，默认值：0
    range: [1, 10000000], //可视范围：[近裁距离, 远裁距离]，取值范围: [任意负值, 任意正值]
    color: [1, 1, 1, 1], //折线颜色
    thickness: 300, //折线宽度
    intensity: 10, //亮度
    flowRate: 0.1, //流速
    shape: 0, //折线类型 0：直线， 1：曲线
    depthTest: false, //是否做深度检测 开启后会被地形高度遮挡
    style: 4, //折线样式 参考样式枚举：PolylineStyle
    tiling: 0.5 //材质贴图平铺比例
  }
  const city_border_dynamic = {
    id: 'city_border_dynamic', //折线唯一标识id
    coordinates: coordinates.map((coord: number[]) => [coord[0], coord[1], height]),
    coordinateType: 0, //坐标系类型，取值范围：0为Projection类型，1为WGS84类型，2为火星坐标系(GCJ02)，3为百度坐标系(BD09)，默认值：0
    range: [1, 10000000], //可视范围：[近裁距离, 远裁距离]，取值范围: [任意负值, 任意正值]
    color: [1, 1, 1, 1], //折线颜色
    thickness: 600, //折线宽度
    intensity: 10, //亮度
    flowRate: 0.3, //流速
    shape: 0, //折线类型 0：直线， 1：曲线
    depthTest: false, //是否做深度检测 开启后会被地形高度遮挡
    style: 3, //折线样式 参考样式枚举：PolylineStyle
    tiling: 2 //材质贴图平铺比例
  }
  fdapi.polyline.add([city_border, city_border_dynamic])

  let city_wall = {
    id: 'city_wall',
    coordinates: coordinates.map((coord: number[]) => [coord[0], coord[1], height]),
    coordinateType: 0, //坐标系类型，取值范围：0为Projection类型，1为WGS84类型，2为火星坐标系(GCJ02)，3为百度坐标系(BD09)，默认值：0
    color: '#215cca', //颜色值
    height: -height * 1.5, //3D多边形的高度
    intensity: 1.0, //亮度
    style: 4, //3DPolygon的样式 请参照API开发文档选取枚举
    tillingX: 0, //可选，仅当3DPolygon的样式支持贴图显示，贴图横向平铺
    tillingY: 0, //可选，仅当3DPolygon的样式支持贴图显示，贴图纵向平铺
    generateTop: false, //是否生成顶面
    generateSide: true, //是否生成侧面
    generateBottom: false //是否生成底面
  }
  fdapi.polygon3d.add(city_wall)
}

// 4 绘制区县边界（行政区化）
const addCountyLayer = async () => {
  // a.行政区边框  b.行政区名称
  const { data } = await getAdministrativeDivisionCounty()

  const polylineList: any[] = []
  const WallList: any[] = []

  data.features.forEach((item: any, index: number) => {
    const coordinates = item.geometry.coordinates[0][0]

    const county_border_id = 'county_border_' + index
    LayerIdObj.polyline.push(county_border_id)
    const county_border = {
      id: county_border_id, //折线唯一标识id
      coordinates: coordinates.map((coord: number[]) => [coord[0], coord[1], height]),
      coordinateType: 0, //坐标系类型，取值范围：0为Projection类型，1为WGS84类型，2为火星坐标系(GCJ02)，3为百度坐标系(BD09)，默认值：0
      range: [1, 10000000], //可视范围：[近裁距离, 远裁距离]，取值范围: [任意负值, 任意正值]
      color: [1, 1, 1, 1], //折线颜色
      thickness: 150, //折线宽度
      intensity: 10, //亮度
      flowRate: 0.1, //流速
      shape: 0, //折线类型 0：直线， 1：曲线
      depthTest: false, //是否做深度检测 开启后会被地形高度遮挡
      style: 4, //折线样式 参考样式枚举：PolylineStyle
      tiling: 0.5 //材质贴图平铺比例
    }
    polylineList.push(county_border)

    const county_wall_id = 'county_wall_' + index
    LayerIdObj.polygon3d.push(county_wall_id)
    let county_wall = {
      id: county_wall_id,
      coordinates: coordinates.map((coord: number[]) => [coord[0], coord[1], height]),
      coordinateType: 0, //坐标系类型，取值范围：0为Projection类型，1为WGS84类型，2为火星坐标系(GCJ02)，3为百度坐标系(BD09)，默认值：0
      color: '#ffffff', //颜色值
      height: -height * 0.5, //3D多边形的高度
      intensity: 1.0, //亮度
      style: 2, //3DPolygon的样式 请参照API开发文档选取枚举
      tillingX: 0, //可选，仅当3DPolygon的样式支持贴图显示，贴图横向平铺
      tillingY: 0, //可选，仅当3DPolygon的样式支持贴图显示，贴图纵向平铺
      generateTop: false, //是否生成顶面
      generateSide: true, //是否生成侧面
      generateBottom: false //是否生成底面
    }
    WallList.push(county_wall)
  })

  fdapi.polyline.add(polylineList)
  fdapi.polygon3d.add(WallList)
}

// 5 绘制行政区标注
const addCountyLabelLayer = async () => {
  const { data } = await getAdministrativeDivisionCountyLabel()
  const markerList: any = []
  data.features.forEach((item: any, index: number) => {
    const coordinates = item.geometry.coordinates
    const name = item.properties.Name
    let label = {
      id: 'county_label_' + index,
      groupId: 'county_label',
      coordinate: [...coordinates, height], //坐标位置
      coordinateType: 0, //默认0是投影坐标系，也可以设置为经纬度空间坐标系值为1
      range: [1, 100000000], //可视范围
      viewHeightRange: [1, 100000000], // 可见高度范围

      text: name, //显示的文字
      useTextAnimation: true, //关闭文字展开动画效果 打开会影响效率
      textRange: [1, 100000000], //文本可视范围[近裁距离, 远裁距离]
      textBackgroundColor: [0, 0, 0, 0], //文本背景颜色
      fontSize: 16, //字体大小
      fontOutlineSize: 2, //字体轮廓线大小
      fontColor: Color.White, //字体颜色
      fontOutlineColor: Color.Black, //字体轮廓线颜色

      displayMode: 2 //智能显示模式  开发过程中请根据业务需求判断使用四种显示模式
    }
    markerList.push(label)
  })

  fdapi.marker.add(markerList)
}

export const exitAdministrativeDivision = async () => {
  console.log('exitAdministrativeDivision')
  await fdapi.weather.setDarkMode(false)
  await fdapi.infoTree.show(hideLayer.map(name => digitalTwinStore.infoTreeObj[name]))
  await fdapi.tileLayer.setStyle(digitalTwinStore.infoTreeObj['大地形影像'], null, null, null, 0.3)
  await fdapi.tileLayer.setStyle(digitalTwinStore.infoTreeObj['苏州地形影像_Terrain'], null, null, null, 1)

  await fdapi.polygon.delete(['city_polygon', 'city_polygon_dynamic'])
  await fdapi.polyline.delete(['city_border', 'city_border_dynamic', ...LayerIdObj.polyline])
  await fdapi.polygon3d.delete(['city_wall', ...LayerIdObj.polygon3d])
  await fdapi.marker.deleteByGroupId('county_label')
}
